//#include<string>
//#include<iostream>
//using namespace std;
//int main()
//{
//	string s1("string");
//	basic_string<char>s2("basic_string");
//
//	cout << s1 << endl;
//	cout << s2 << endl;
//
//	return 0;
//}

//#include<string>
//#include<iostream>
//using namespace std;
//template<class T>
//class basic_string
//{
//public:
//
//private:
//	T* _str;
//};
//int main()
//{
//	char str[] = "你好";
//	str[1] += 1;
//	str[3] += 1;
//}



#include<iostream>
using namespace std;

#include<string>
#include<vector>
#include<list>

void test_string1()
{
	string s1("hello world");// 用字符串来构造string类的对象

	string s2;// 默认构造，无参，构造空字符
	string s3(s1);// 拷贝构造，生成s1一样的字符串
	string s4("hello world", 5);// 复制字符串"hello world"的前5个字符
	string s5(10, '#');// 生成10个'#'字符的字符串
	string s6(s1, 0, 4);// 复制s1中从字符位置0开始并跨越5个字符的部分

	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << s5 << endl;
	cout << s6 << endl;
}

// 下标+[]其实就是：
//class string
//{
//public:
//	char& operator[](size_t pos)
//	{
//		return _str[pos];
//	}
//private:
//	char* _str;
//	size_t _size;
//	size_t _capacity;
//};
void test_string2()
{
	string s1("hello string");
	// 第一种遍历方式
	// 下标+[]
	for (size_t i = 0; i < s1.size(); i++)
	{
		// 其中 s1.size()是string类的成员函数，用于返回当前字符串对象的大小，即字符串中字符的个数
		cout << s1[i] << "";// 取出s1字符串中第i个字符
	}
	cout << endl;
	for (size_t i = 0; i < s1.size(); i++)
	{
		s1[i]++;// 是对字符串s1中第i个字符的操作，即取出第i个字符，将其ASCII值加1，然后重新赋值给该位置
	}
	cout << endl;
	// 再输出s1字符串
	for (size_t i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << "";
	}

	// 第二种遍历方式
	// 迭代器
	string s3("hello world");
	string::iterator it3 = s3.begin();// 定义一个string类型s3的迭代器it3，并将其指向s3的起始位置begin;
	while (it3 != s3.end())// 当迭代器it3并未指向s3的结束位置时执行循环;
	{
		*it3 -= 3;// 取出it3指向的位置上的字符，并将其ASCLL减3;
		++it3;// 将迭代器it3指向下一个位置;
	}
	cout << endl;
	it3 = s3.begin();// 将迭代器it3重新指向s3的起始位置begin;
	while (it3 != s3.end()) // 再次遍历s3中的每个字符，输出修改后的字符;
	{
		cout << *it3 << "";
		++it3;
	}
	cout << endl;

	// cout << typeid(it3).name() << endl;// 结果如下:
	// class std::_String_iterator<class std::_String_val<struct std::_Simple_types<char> > >

	// vector
	vector<int>v;// 定义一个整形vector v;
	v.push_back(1);// 向vector v尾部添加元素1;
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << "";
		++it;
	}
	cout << endl;

	// list
	list<int>lt;// 定义一个整形 list lt
	lt.push_back(1);// 向list lt尾部添加元素1
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	list<int>::iterator itt = lt.begin();// 定义一个list lt的迭代器itt，指向lt的起始位置
	while (itt != lt.end())// 遍历list lt，输出其中的每个元素
	{
		cout << *itt << "";
		++itt;
	}
	cout << endl;
	
	// 第三种遍历方式
	// 范围for----底层就是迭代器
	// s3
	for (auto e : s3)
	{
		cout << e << "";
	}
	cout << endl;
	// vector
	for (auto e : v)
	{
		cout << e << "";
	}
	cout << endl;
	// list 
	for (auto e : lt)
	{
		cout << e << "";
	}
	cout << endl;
}
void test_string3()
{
	string s;
	s.push_back('C');
	s.push_back('S');
	s.push_back('D');
	s.push_back('N');
	cout << s << endl;
}

void test_string4()
{
	string s("hello world");
	// replace(pos,len,str) 将第pos位置开始的len个字符替换为字符串str
	s.replace(6, 4, "CSDN");

	// replace(pos,len,n,char)将pos位置开始的len个字符替换为n个字符char
	s.replace(10, 1, 3, '!');

	cout << s << endl;
}
int main()
{
	//test_string1();
	//test_string2();
	test_string3();

	return 0;
}